package w4_c1_linkedlist;


import w3_c2_stack.Stack;

/**
 * 用链表实现Stack。push和pop操作仅作用于链表头节点处，时间复杂度O(1)。
 * @param <E>
 */
public class LinkedListStack <E> implements  Stack<E>{
    private LinkedList<E> linkedList ;//数据的Container，一个链表。

    public LinkedListStack(){
        linkedList = new LinkedList<>();
    }

    public int getSize() {
        return linkedList.getSize();
    }

    @Override
    public boolean isEmpty() {
        return linkedList.isEmpty();
    }

    /**
     * push操作实现，仅仅是调用了链表类的addFirst()方法。
     * @param e
     */
    @Override
    public void push(E e) {
       linkedList.addFirst(e);
    }

    /**
     * pop操作的实现。仅仅是调用了链表的removeFirst()方法。
     * @return
     */
    @Override
    public E pop() {
        return linkedList.removeFirst();
    }

    /**
     * 查看栈顶元素。
     * @return
     */
    @Override
    public E peek() {
        return linkedList.getFirst();
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append(String.format("LinkedListStack, top:\t" ));
        res.append(linkedList);
        return res.toString();
    }

    public String getName() {
        return new String("LinkedListStack");
    }

    /**
     * 测试用。
     * @param args
     */
    public static void main(String[] args) {
        LinkedListStack<Integer> stack = new LinkedListStack<>();
        int i=0, n = 10;
        System.out.println("Push test=============");
        for (i = 0; i < n; i++) {
            stack.push(i);
            System.out.println(stack);
        }

        System.out.println("Pop test==============");
        for (i = 0; i < n; i++) {
            stack.pop();
            System.out.println(stack);
        }
    }
}
